From c0449e324527cec45259cf873fc07e91672b0757 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Tue, 21 Mar 2023 16:16:17 -0300 Subject: [PATCH] gdk/vulkancontext: Pass all painted rects Instead of passing a single, potentially massive rectangle that is just the extents of the damage rect, collect and pass all damage rects individually. --- gdk/gdkvulkancontext.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/gdk/gdkvulkancontext.c b/gdk/gdkvulkancontext.c index 74f2a0e08d..59416695cf 100644 --- a/gdk/gdkvulkancontext.c +++ b/gdk/gdkvulkancontext.c @@ -474,24 +474,35 @@ gdk_vulkan_context_end_frame (GdkDrawContext *draw_context, GdkSurface *surface = gdk_draw_context_get_surface (draw_context); VkPresentRegionsKHR *regionsptr = VK_NULL_HANDLE; VkPresentRegionsKHR regions; - cairo_rectangle_int_t extents; + VkRectLayerKHR *rectangles; + int n_regions; int scale; - cairo_region_get_extents (painted, &extents); scale = gdk_surface_get_scale_factor (surface); + n_regions = cairo_region_num_rectangles (painted); + rectangles = g_alloca (sizeof (VkRectLayerKHR) * n_regions); + + for (int i = 0; i < n_regions; i++) + { + cairo_rectangle_int_t r; + + cairo_region_get_rectangle (painted, i, &r); + + rectangles[i] = (VkRectLayerKHR) { + .layer = 0, + .offset.x = r.x * scale, + .offset.y = r.y * scale, + .extent.width = r.width * scale, + .extent.height = r.height * scale, + }; + } regions = (VkPresentRegionsKHR) { .sType = VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR, .swapchainCount = 1, .pRegions = &(VkPresentRegionKHR) { - .rectangleCount = 1, - .pRectangles = &(VkRectLayerKHR) { - .layer = 0, - .offset.x = extents.x * scale, - .offset.y = extents.y * scale, - .extent.width = extents.width * scale, - .extent.height = extents.height * scale, - } + .rectangleCount = n_regions, + .pRectangles = rectangles, }, }; -- 2.30.2